进程和线程之面试须知
中断:
软件中断:一个进程给另一个进程发送信号
硬件I/O中断
进程
相关系统调用
进程描述符
进程控制块(PCB)
五种进程状态转换
进程的创建
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid;char *message;int n = 0;pid = fork();while(1){if(pid < 0){perror("fork failed\n");exit(1);}else if(pid == 0){n--;printf("child's n is:%d\n",n);}else{n++;printf("parent's n is:%d\n",n);}sleep(1);}exit(0);
}
fork创建子进程把数据空间、堆、栈复制一份,所以可以发现子进程和父进程之间并没有对各自的变量产生影响。
vfork()
vfork创建子进程,与父进程共享内存数据
vfork先保证子进程先执行,当子进程调用exit()或者exec后,父进程才往下执行
用vfork时,一般都是紧接着调用exec,所以不会访问父进程数据空间,也就不需要在把数据复制上花费时间了,因此vfork就是”为了exec而生“的。
子进程不使用exit退出,使用return的结果
进程执行代码替换
execve()
execve()和waitpid()结合实例:shell执行
进程终止
正常终止(5种)
异常终止(3种)
wait和waitpid函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h> int main()
{pid_t pid0,pid1;pid0 = fork();if(pid0 < 0){perror("fork");exit(1);}else if(pid0 == 0){sleep(5);exit(0);//child}else{do{pid1 = waitpid(pid0,NULL,WNOHANG);if(pid1 == 0){printf("the child process has not exited.\n");sleep(1);}}while(pid1 == 0);if(pid1 == pid0){printf("get child pid:%d",pid1);exit(0);}else{exit(1);}}return 0;
}当把第三个参数WNOHANG改为0时,就不会有上面五个显示语句了,说明父进程阻塞了。a.out 的代码如下:#include <stdio.h>
void main(){printf("hello WYJ\n");
}process.c的代码如下:#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/times.h>
#include <sys/wait.h>int main()
{pid_t pid_1,pid_2,pid_wait;pid_1 = fork();pid_2 = fork();if(pid_1 < 0){perror("fork1 failed\n");exit(1);}else if(pid_1 == 0 && pid_2 != 0){//do not allow child 2 to excute this process.if(execlp("./a.out", NULL) < 0){perror("exec failed\n");}//child; exit(0);}if(pid_2 < 0){perror("fork2 failded\n");exit(1);}else if(pid_2 == 0){sleep(10);}if(pid_2 > 0){//parent do{pid_wait = waitpid(pid_2, NULL, WNOHANG);//no hangsleep(2);printf("child 2 has not exited\n");}while(pid_wait == 0);if(pid_wait == pid_2){printf("child 2 has exited\n");exit(0);}else{// printf("pid_2:%d\n",pid_2);perror("waitpid error\n");exit(1);}}exit(0);
}
僵尸进程
在进程调用了exit之后,该进程并非马上就消失掉,而是留下了一个成为僵尸进程的数据结构,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。
子进程结束之后为什么会进入僵尸状态? 因为父进程可能会取得子进程的退出状态信息。
如何查看僵尸进程?
linux中命令ps,标记为Z的进程就是僵尸进程。
守护进程Daemon
进程间通信-IPC
1.管道
2.消息队列
3.信号
4.共享代码
5.socket
MFC之进程间通信
线程
线程同步
1.互斥对象
2.事件对象
3.关键代码段
进程和线程之面试须知相关推荐
- Linux进程与线程的区别 详细总结(面试经验总结)
首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...
- Interview:算法岗位面试—上海某公司算法岗位技术(偏机器学习,证券基金行业)面试考点之进程与线程区别、GD改进的算法、ROC和AUC
Interview:算法岗位面试-上海某公司算法岗位技术(偏机器学习,证券基金行业)面试考点之进程与线程区别.GD改进的算法.ROC和AUC 导读:其实,考察的知识点,博主都做过,但是,emmm,这些 ...
- apply_async进程不执行_c/c++面试精选题(八)简单回答,进程和线程关系及区别...
1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基 ...
- Interview:算法岗位面试—BAT公司问题面试之计算机基础(进程与线程的区别)、经典概率问题等集锦
Interview:算法岗位面试-BAT公司问题面试之计算机基础(进程与线程的区别).经典概率问题等集锦 目录 计算机基础问题 1.进程与线程的区别 概率问题 1.貂蝉与西施回头率比美问题 计算机基础 ...
- 深度好文|面试官:进程和线程,我只问这19个问题
# 干了这碗鸡汤! 我急切地盼望着可以经历一场放纵的快乐,纵使巨大的悲哀将接踵而至,我也在所不惜. -- 太宰治 <人间失格> 下面隆重推出我呕心沥血,耗时半个月完成的精心力作: 0 1 ...
- 测试开发面试(八)——进程与线程、python数据结构、数据库
一.对公司有何了解? 星网锐捷是位于福州的国内领先的企业级网络.通讯.终端设备.视频应用产品及系统解决方案供应商,秉承的是"融合科技创新,构建智慧未来"的经营理念,公司旗下有多个子 ...
- linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...
- c语言面试进程 线程区别,面试必问题目“进程、线程对比”,包你会-博客
简要说明 在C语言.C++等方向面试时,经常会被问道 进程.线程等问题,当然了10年前我刚开始找工作那会,也是各种煎熬"我又不写操作系统,为什么还要学这么底层的知识",真想不通面试 ...
- 【面试问题】进程和线程的区别——通俗易懂
1. "进程"是什么 1.2 管理进程 1.3 内存管理 1.4 进程间通信 2. 线程是什么 3.进程和线程的区别 1. "进程"是什么 在对比"进 ...
最新文章
- ArchLinux上安装TIM
- pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
- SharedPreferences的使用
- java使用switch编月份和舱位,纠结,代码和书上的不对解决思路
- mujava 软件测试实验报告
- Linux学习之系统编程篇:线程同步的引出和思想
- MATLAB机器学习系列-4函数篇
- nfc卡模式与标准模式_渠道如何标准化管理,建立新的销售模式,提升业绩完成率...
- linux修改hostname
- 面试题 03.02. 栈的最小值
- Ubuntu 下监控进程网络流量
- ASP.NET上传下载文件
- python sorted下标_初学者掌握python 列表需要知道的操作
- 数学建模(一)层次分析法
- 解决办法:开机后过很长时间键盘才能用
- java 打印request的原始请求数据
- Spring源码解析之-doCreateBean() 详解
- [思考] 闲时随笔一篇
- 关于JAVA开发小游戏如何做读档和存档功能的这件事
- Unity-安卓端透明背景设置
热门文章
- python爬虫学习之路(二)re库的使用方法
- win10下注册MSCOMM32控件
- 夜了,为什么还不想睡
- 系统安装部署系列教程(二):硬盘安装方式安装系统
- 常用MAVROS话题和服务
- 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)
- 利用nodemcu和mqtt协议让嵌入式设备接入互联网(一.layui前端框架)
- excel多列合并成一列加符号_Excel中如何将每行空格数据隔开为多列,以及如何合并多列数据为一列...
- 让火狐firefox朗读文本
- 国家信息中心副主任周民:加快形成网络安全的亮剑精神