什么是进程?
-
什么是进程
-
概念:进程是程序的一次动态执行的过程,包括创建,调度和消亡
-
查看进程的命令: ps ; ps aux ; ps -ef ; pstree ; top ; ps axj ;
-
进程和程序的区别: 程序(a.out)是静态的,是存在磁盘上的一些指令的有序集合,不包括执行的过程 进程(./a.out)是程序的一次动态执行的过程,包括创建,调度和消亡
-
为什么进程是程序执行和资源管理的最小单位? 每个进程都会分配0~4G的虚拟内存,管理操作是在这虚拟内存中进行的,映射在物理内存上不会产生冲突
-
为什么有虚拟内存? 因为多任务(用户可以同时运行多个应用程序),安全(每个进程分开管理操作,不会冲突)
-
如何区分不同的进程? -->PID进程号 进程是由进程创建的,有子进程和父进程
-
进程的类型:
-
交互进程:由shell控制和运行,与用户进行交互;既可以在前台运行,也可以在后台运行; +代表是前台进程;杀死进程:kill -l ;
-
批处理进程:不与用户交互;不属于某个终端;通常在后台运行,它被提交到一个队列中以便顺序执行
-
守护进程:一直在后台运行;不可操作;一般在Linux启动时开始执行,系统关闭时才结束。
进程的状态:
-
命令 man ps可用来查看进程状态 R:运行态(正在运行或准备运行的进程) S:可中断等待(正在等待某件事情发生或能够占用某些资源,可被信号中断) D:不可中断等待(不会被中断) T:停止状态(暂停的进程) Z:僵尸态(已经终止的进程,但内核空间其task_struct(PCB进程控制块)还在) X:消亡态(进程已经终止,且进程控制块也不存在了)
-
task_struct内核结构里面包含进程的所有信息,包括:进程的状态,进程的基本信息,进程的标识符,内存相关信息,父进程相关信息,与进程相关的终端信息,当前工作目录,打开的文件信息,所接受的文件信号信息等; PCB进程控制块——task_struct管理着每个进程资源 内核可以通过进程控制块访问每个进程的所有信息
如何创建守护进程?
-
第一步:创建子进程,让它变成孤儿进程(断绝血缘关系,脱离控制终端)
-
第二步:setsid( ):在子进程中创建新会话并担任新会话组组长(变?此时PID=PGID=SID)
-
进程组(PGID):多个进程的集合;组长进程的ID就是组ID;
-
会话组(SID):多个进程组的集合;一个会话起始于用户登录,终止与用户退出;第一个进程位是会话组组长
-
-
第三步:chdir():改变当前目录(让根目录作为当前守护进程的工作目录,不会被轻易删除,root)
-
第四步:umask( ):重设文件掩码(增强守护进程的灵活性,屏蔽不需要的位)
-
第五步:getdtablesize( ):关闭文件描述符(不关闭会影响前台进程)
-
创建完毕,进入进程工作
进程间通信:
传统通信:无名管道,有名管道,信号;system v:共享内存,消息队列,信号量;
线程:
-
为什么有线程? (1)OS在调度时要来回切换地址空间,系统开销比较大; (2)进程之间需要通信; (3)有多个任务时,将多个进程放在一个进程里共享地址空间,这样系统开销减小;
-
概念: (1)线程是系统调度的最小单位;(2)线程是共享地址空间的多个任务,进程叫主线程,其他的任务叫子线程; (3)线程可以对进程的内存空间和资源进行访问,并与同一进程中其他线程共享; (4)线程具有高效性和可操作性;
线程编程基础:
-
创建线程:pthread_create();要使用回调函数void*(*start_routine)(void *);
-
线程间也会抢夺资源,用pthread_join函数可以回收子线程,阻塞主线程,等待子线程执行结束;
-
游离态:pthread_detach( ); 将子线程设置为游离态,子线程退出后不再被主线程回收,而是被系统回收,这个函数不会阻塞主线程;
-
退出线程:pthread_exit(线程退出时的返回值,一般写NULL);
线程同步和互斥:
-
线程间同步和互斥
-
线程间同步:多个线程按照顺序相互配合完成一件事(保证临界资源完整性)(编译时要链接 -lpthread)
-
用信号量实现同步操作时,往往设置多个信号量,安排不同初始值来实现线程的顺序执行;
-
初始化信号量函数:sem_init( );
-
P操作:int sem_wait(sem_t *sem)
-
V操作:int sem_post(sem);
-
信号量实现同步
-
-
线程间互斥:保护共享资源完整性但不保证同步(互斥锁)(编译时要链接 -lpthread)
-
初始化互斥锁:pthread_mutex_init();
-
上锁:pthread_mutex_lock();
-
解锁pthread_mutex_unlock();
-
销毁锁:pthread_mutex_destroy();
-
-