进程线程html
1.进程:数组
孤儿进程,守护进程,僵尸进程缓存
函数:fork ,wait,waitpid,网络
进程间通信(IPC):多线程
1. 种类:无名管道,有名管道,信号通信 并发
消息队列,共享内存,信号量灯 异步
socketsocket
2.目的:实现数据共享函数
3. 测试
无名管道:内核在物理空间开辟的一段共享缓存,无文件名只用于亲缘之间;
函数:int pipe( int pipefd[2] ) :数组存放读写文件描述符
特色:
代码示例:http://www.javashuo.com/article/p-xvojjtwl-hg.html
有名管道:内核在物理空间开辟的一段共享缓存,已文件形式操做缓存;
函数:int mkfifo(const char *pathname, mode_t mode) 建立只须要一个进程,另外一个进程直接读写
特色:
代码示例:http://www.javashuo.com/article/p-btultepa-hh.html
信号通信:
信号处理方式:默认,自定义,忽略
特色:惟一异步通讯的IPC
消息队列:内核在物理空间建立用于存放消息的双向循环链表;
函数:msgget :建立获取标识符
msgsend :经过标识符发送编号内容
msgrcv :经过标识符接收编号内容
msgctl :经过标识符删除消息队列
特色:
代码示例:http://www.javashuo.com/article/p-sgfadpax-hm.html
共享内存:内核在物理空间开辟一大段缓存空间,直接使用地址共享读写,实现通讯;
函数:shmget :建立获取共享内存
shmat : 挂载(映射创建)
shmdt : 卸载(映射取消)
shmctl :删除共享内存
特色:
代码示例:http://www.javashuo.com/article/p-gpthaggc-hn.html
信号量灯:多进程线程共享操做,经过加锁机制资源保护,实现同步与互斥,防止干扰;
函数:semget :建立获取信号量集合
semctl :设置初始值
semop : P V 操做
semctl : 删除信号量集合
特色:
代码示例:http://www.javashuo.com/article/p-dxaqguza-ho.html
socket:
特色:
代码示例:
2.线程:轻量级进程,CPU调度的最小单位
函数:pthread_creat 注册线程函数,实现并发运行
pthread_dtach/self 线程分离,自动回收
pthread_cannel/exit 粗暴主动,终止线程
pthread_join 回收资源(阻塞等待次线程回收)
pthread_cleanup_push/pop 线程退出函数(压栈弹栈必须成对)
锁:
互斥锁初始化方式:静态宏, 动态函数
1. 静态宏的设置:
快速静态锁:普通锁,在嵌套锁时会出现死锁
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER
递归锁:能够嵌套上锁
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
检错锁:在出现嵌套锁时返回一个错误信息,不会死锁
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
2. 动态函数设置:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
参一为初始化的锁名称
参二为锁的属性,对应快速锁,嵌套锁,检错锁。
锁的操做:加锁、解锁、测试加锁、销毁锁
1.加锁:无论是哪一种类型的锁,都不可能被两个线程
int pthread_mutex_lock(pthread_mutex_t *mutex)
2.解锁:对于快速锁,则解除锁定。对于嵌套锁使锁上的技术减一,表示上了两层。
对于检错锁,若是锁是本线程加的,则解除锁,不然啥也不干
int pthread_mutex_unlock(pthread_mutex_t *mutex)
3.测试:使用测试加锁,则不会挂起阻塞。
int pthread_mutex_trylock(pthread_mutex_t *mutex)
4.销毁: 销毁锁,意味着释放所占用的资源,并且要求锁处于开放状态。
int pthread_mutex_destroy(pthread_mutex_t *mutex)
特色:
代码示例:http://www.javashuo.com/article/p-xnuktoss-hp.html
<笔记>
1.进程内部多线程通信实现数据共享,使用全局变量便可,开销小
2.
命令:
top:Linux的任务管理器·
PS :静态的进程统计信息
a:显示当前终端下的全部进程信息,包括其余用户的进程。 u:使用以用户为主的格式输出进程信息。 x:显示当前用户在全部终端下的进程。 -e:显示系统内的全部进程信息。 -l:使用长(long)格式显示进程信息。 -f:使用完整的(full)格式显示进程信息。
ps aux (简单列表的形式显示出进程信息):
USER :进程用户名 PID :进程的ID PPID :父进程ID %CPU :进程占用的CPU百分比 %MEM :进程占用内存的百分比 NI :进程的NICE值,数值大,表示较少占用CPU时间; VSZ :进程使用的虚拟內存量(KB); RSS :进程占用的固定內存量(KB)(驻留中页的数量); TTY :进程在哪一个终端上运行(登陸者的終端位置),若与终端无关,显示(?)。若pts/0,表示网络链接主机进程 WCHAN: 当前进程程是否正在运行,若为-表示正在运行; START :进程被触发启动时间; TIME : 进程实际使用CPU运行的时间; COMMAND:命令的名称和参数;
STAT:
D 没法中断的休眠状态(一般 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 中止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本不多見);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 相似 NPTL pthreads);
+ 位于后台的进程组;
进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的造成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 中止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后中止运行运行)
kill 进程号(杀死进程) kill -9 pid 强制终止进程
kill -l :(Linux信号列表)
1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的)
32 ~ 63的信号是后来扩充的,称作可靠信号(实时信号)
区别:不可靠信号不支持排队,可能会形成信号丢失
而可靠信号支持排队,不会形成信号丢失
消息队列 / 共享内存 / 信号量:
查看 :ipcs -q / -m / -s 删除:ipcrm -q / -m / -s [-mid]
key:key shmid:编号 owner:建立用户 perms:权限 bytes:大小 nattch:链接共享内存的进程数
status:共享内存的状态
<笔记>
1. 程序运行在磁盘,不占系统资源
进程运行在内存,占用系统资源
2. fork以前的代码,父子进程都拥有
3. 进程就是主线程
4. 管道是半双工通讯
5. 进程线程应用:
多进程:执行新程序
多线程:执行多任务
6. wait 和 waitpid 区别 :
7.