进程和线程
(2)线程空间位于进程空间内部,独享栈区(每个线程栈区独立),共享文本区、数据区、堆区(一个进程中的多个线程共用以上区域)让父进程先结束,子进程成为孤儿进程,孤儿进程会被init进程收养,子进程结束,init回收子进程空间,避免产生僵尸进程。(2)多进程调度,效率低,因为切换进程任务时需要映射不同的物理地址空间,增大系统开。(1)线程位于进程空间内部,线程异常崩溃会导致进程崩溃,进程中其余的线程均
接上节进程
一、函数接口
1、exit
原型:void exit(int status);
功能:
让进程结束
在主函数中调用exit和return效果相同
2、_exit
原型:void _exit(int status);
功能:
直接让进程结束
exit:刷新缓存区,执行一系列进程退出注册的操作,最后让进程结束
_exit:不会刷新缓存区,直接让进程结束
3、wait
原型:pid_t wait(int *wstatus);
功能:
回收子进程空间
参数:
wstatus:存放子进程结束状态空间的首地址
返回值:
成功返回回收到的子进程的PID
失败返回-1
wait:具有阻塞功能,子进程没结束,父进程阻塞等待子进程结束,回收子进程空间
WIFEXITED(wstatus):判断子进程是否正常退出
WEXITSTATUS(wstatus):获得子进程结束时的值
WIFSIGNALED(wstatus):判断子进程是否被信号杀死
WTERMSIG(wstatus):获得杀死子进程信号的值
WCOREDUMP(wstatus):判断子进程是否段错误退出
WIFSTOPPED(wstatus):判断子进程是否被停止
WSTOPSIG(wstatus):获得停止子进程的编号
WIFCONTINUED(wstatus):判断进程是否继续执行


4、waitpid
原型:pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
回收指定的子进程空间
参数:
pid:回收子进程的ID号、-1表示任意子进程
wstatus:存放子进程结束状态空间的首地址
options:
0 阻塞回收
WNOHANG 非阻塞回收
返回值:
成功返回回收到的子进程的PID
失败返回-1
如果WNOHANG设置,没有子进程结束,返回0
wait(NULL) == waitpid(-1, NULL, 0);
二、 进程的消亡
1. 僵尸态进程如何产生
进程代码执行结束,但是空间没有被回收
2. 如何避免产生僵尸进程
让父进程先结束,子进程成为孤儿进程,孤儿进程会被init进程收养,子进程结束,init回收子进程空间,避免产生僵尸进程
子进程结束,父进程回收子进程空间,避免产生僵尸进程
三、 exec函数族
int execl(const char *path, const char *arg, .../* (char *) NULL */);
int execlp(const char *file, const char *arg, .../* (char *) NULL */);
int execle(const char *path, const char *arg, .../*, (char *) NULL, char
* const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
功能:
利用进程空间执行另外的一段代码
l:参数以列表形式传递
v:参数以指针数组形式传递
p:在环境变量PATH对应的目录下找file
e:更新进程的环境变量





四、线程
1、线程的概念:
线程是轻量级的进程
2. 进程和线程的区别:
(1)进程的空间是独立的
(2)线程空间位于进程空间内部,独享栈区(每个线程栈区独立),共享文本区、数据区、堆区(一个进程中的多个线程共用以上区域)
(3)进程是操作系统资源分配的最小单元
(4)线程是CPU任务调度的最小单元
3. 线程的创建:
每个线程会创建一个属于该线程的独立的栈空间默认为8M,文本区、数据区、堆区使用进程
中的区域

4. 线程的调度:
等同于进程调度
宏观并行,微观串行
5. 线程的消亡
等同于进程的消亡,线程消亡需要回收线程空间
6. 多进程和多线程优缺点:
进程:
(1)每个进程空间独立,安全性好,一个进程异常崩溃不会影响其余进程
(2)多进程调度,效率低,因为切换进程任务时需要映射不同的物理地址空间,增大系统开
销
(3)多进程通信不方便,因为空间独立,没有共享空间
(4)进程考虑资源竞争问题,因为没有共享空间
线程:
(1)线程位于进程空间内部,线程异常崩溃会导致进程崩溃,进程中其余的线程均结束
(2)多线程调度,效率高,因为在同一进程空间内部切换不同的任务
(3)多线程通信非常方便,多线程数据区、堆区共享
(4)通过锁的机制防止资源竞争
7. 线程相关函数接口:
(1)pthread_create
原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void*arg);
功能:
创建一个线程任务
参数:
thread:存放线程ID空间首地址
attr:线程的属性,使用默认属性传NULL
start_routine:线程函数入口
arg:线程函数的参数
返回值:
成功返回0
失败返回非0


更多推荐



所有评论(0)