长沙专业网站设计服务,云南 网站建设网站,oppo应用商店下载,企微宝C操作系统与网络编程#xff08;特定岗位#xff09; 如果你应聘的岗位涉及基础开发、网络编程或高性能计算#xff0c;这部分内容会是重点。
1. 操作系统 *问题类型#xff1a; 进程间通信#xff08;IPC#xff09;的方式#xff08;管道、消息队列、共享内存、信号量…C操作系统与网络编程特定岗位 如果你应聘的岗位涉及基础开发、网络编程或高性能计算这部分内容会是重点。
1. 操作系统 *问题类型 进程间通信IPC的方式管道、消息队列、共享内存、信号量、信号 管道Pipe 匿名管道用于父子进程通信 int fd[2];
pipe(fd); // fd[0]读端, fd[1]写端
if (fork() 0) { /* 子进程 */ write(fd[1], data, size); }
else { /* 父进程 */ read(fd[0], buffer, size); }命名管道FIFO无关进程通信 mkfifo /tmp/myfifo # 终端创建int fd open(/tmp/myfifo, O_WRONLY);
write(fd, data, size);消息队列Message Queue #include sys/msg.h
struct msgbuf { long mtype; char mtext[100]; };
int msqid msgget(IPC_PRIVATE, 0666);
msgsnd(msqid, msg, sizeof(msg.mtext), 0);
msgrcv(msqid, msg, sizeof(msg.mtext), 1, 0);共享内存Shared Memory #include sys/shm.h
int shmid shmget(IPC_PRIVATE, size, 0666);
char* shm (char*)shmat(shmid, NULL, 0);
memcpy(shm, data, size); // 进程间共享
shmdt(shm);信号量Semaphore #include sys/sem.h
int semid semget(IPC_PRIVATE, 1, 0666);
semctl(semid, 0, SETVAL, 1); // 初始值1
struct sembuf op {0, -1, 0}; // P操作
semop(semid, op, 1);信号Signal #include csignal
signal(SIGUSR1, handler); // 注册处理器
kill(pid, SIGUSR1); // 向进程发信号 线程同步机制互斥量、信号量、读写锁、条件变量 互斥量Mutex #include mutex
std::mutex mtx;
mtx.lock();
// 临界区
mtx.unlock();信号量Semaphore (C20) #include semaphore
std::counting_semaphore1 sem(1); // 二元信号量
sem.acquire(); // P操作
// 临界区
sem.release(); // V操作读写锁Shared Mutex #include shared_mutex
std::shared_mutex rw_lock;
// 写锁独占
{ std::lock_guardstd::shared_mutex lock(rw_lock); }
// 读锁共享
{ std::shared_lockstd::shared_mutex lock(rw_lock); }条件变量Condition Variable #include condition_variable
std::mutex mtx;
std::condition_variable cv;
// 线程A等待条件
std::unique_lockstd::mutex lock(mtx);
cv.wait(lock, []{ return condition; });
// 线程B通知条件满足
cv.notify_all();虚拟内存、物理内存 特性虚拟内存物理内存本质进程看到的连续地址空间实际的 RAM 硬件管理操作系统通过 MMU 映射直接由内存控制器管理大小通常远大于物理内存如 64TB受硬件限制如 32GB碎片处理无需连续物理块需要连续物理块C 体现char *p new char[1e9]; 可分配malloc 实际占用物理页交换机制页面可换出到磁盘始终驻留 RAM访问速度依赖TLB/页表命中直接访问约 100ns映射关系 虚拟地址 → MMU页表查询→ 物理地址页错误Page Fault当访问未映射的虚拟页时触发操作系统介入处理 C 代码验证内存地址 #include iostream
int main() {int x;std::cout 虚拟地址: x std::endl;// 物理地址需通过操作系统接口获取如Linux的 /proc/pid/pagemap
}2. 网络编程 *问题类型 TCP/IP 协议栈的五层/层模型 层级功能关键协议/设备物理层传输比特流定义物理设备标准电压、接口类型网线、光纤、中继器数据链路层帧格式化、错误检测/纠正控制物理介质访问以太网Ethernet、交换机网络层路由寻址、IP分组转发管理跨网络主机通信IP、ICMP、路由器传输层提供端到端可靠/不可靠传输流量控制端口寻址TCP、UDP应用层面向应用程序的数据封装与解析HTTP、FTP、DNS TCP 和 UDP 的区别、特点和适用场景 特性TCPUDP连接方式面向连接三次握手无连接可靠性可靠确认重传、有序交付不可靠可能丢包、乱序速度慢拥塞控制、流量控制快无控制开销头部开销20~60字节8字节适用场景网页浏览HTTP、文件传输FTP、邮件视频会议、在线游戏、DNS查询 TCP 交互流程和四次挥手过程 第一次挥手主动关闭方发送FIN报文进入FIN_WAIT_1状态。第二次挥手被动关闭方回复ACK报文进入CLOSE_WAIT状态主动方收到后进入FIN_WAIT_2。第三次挥手被动方处理完数据后发送FIN报文进入LAST_ACK状态。第四次挥手主动方回复ACK报文进入TIME_WAIT状态被动方收到后关闭连接。 为什么需要四次 TCP是全双工通信需独立关闭两个方向的数据流如A关闭发送后B仍可发送剩余数据。 TIME_WAIT状态 作用 保证被动关闭方能正确关闭若ACK丢失可重传FIN。防止历史报文干扰新连接等待2MSL使旧报文消亡。 持续时间2MSLMSL通常30秒共60秒。优化方法 开启 tcp_tw_reuse tcp_timestamps复用TIME_WAIT连接。设置 SO_LINGER强制跳过TIME_WAIT慎用。 阻塞 IO、非阻塞 IO、多路复用 IO (select, poll, epoll) 的区别和优缺点 模型工作机制优点缺点阻塞IO调用后线程挂起直到数据就绪编程简单并发能力差非阻塞IO立即返回状态需轮询检查就绪避免线程阻塞轮询消耗CPU多路复用IO单线程监听多个fdselect/poll/epoll高并发、资源占用少编程复杂异步IO内核完成操作后回调通知无等待开销兼容性差Linux支持弱多路复用实现对比 select/pollO(n)遍历所有fd支持fd数少默认1024。epollO(1)事件通知支持海量fd10万边缘触发ET性能更高。 epoll的工作模式水平触发 LT、触发 ET 模式触发条件编程要求典型场景水平触发LTfd就绪时持续通知直到事件处理简单不易丢事件默认模式通用场景边缘触发ETfd状态变化时仅通知一次严格需循环读/写高性能服务器ET模式注意事项 需循环读写直到返回EAGAIN错误否则会丢失后续事件。非阻塞fd必需避免单次未处理完导致线程阻塞。 常见的网络编程模型单线程、多进程、多线程、Reactor/Proactor 单线程 所有操作串行执行如Redis主线程。简单但无法利用多核吞吐量低。 多进程/多线程 每个连接独立进程/线程如Apache。并发能力强但资源消耗大上下文切换开销高。 Reactor模式 核心事件驱动 多路复用。分工 MainReactor处理新连接单线程。SubReactor处理IO事件多线程。 应用Netty、Nginx。 Proactor模式 异步IO 回调通知如Windows IOCP。 耗大上下文切换开销高。 Reactor模式 核心事件驱动 多路复用。分工 MainReactor处理新连接单线程。SubReactor处理IO事件多线程。 应用Netty、Nginx。 Proactor模式 异步IO 回调通知如Windows IOCP。性能高但Linux支持弱。