- 博客(61)
- 资源 (6)
- 收藏
- 关注
原创 哈工大李治军老师操作系统实验之PROC文件系统实现
proc 文件系统的实现实验目的掌握虚拟文件系统的实现原理实践文件、目录、文件系统等概念实验内容在Linux0.11 上实现procfs(proc文件系统)内的psinfo结点。读取此结点内容时,可得到系统当前所有进程的状态信息。例如用cat命令显示/proc/psinfo的内容:cat /proc/psinfopid state father counter start_time0 1 -1 0
2021-09-06 20:42:14 467
原创 哈工大李治军老师操作系统实验七----终端设备控制
文章目录实验内容实验目的实验需要具备的基本知识键盘输入与显示器显示整体流程实验过程实验内容当按下F12时,控制端所有字母变成* ,再按一次则恢复,以此类推…实验目的加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念通过实践掌握Linux0.11对键盘终端和显示器终端的处理过程。实验需要具备的基本知识键盘I/O是一种典型的中断驱动事件,既然是中断就对应需要:1. 中断号 2. 中断处理函数。中断号实验手册已经通过set_trap_gate函数告诉我们是0x21 (十进制的
2021-09-02 21:18:34 657 1
原创 哈工大李治军老师操作系统实验之地址映射与共享
地址映射与共享实验目的深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念实践段、页式内存管理的地址映射过程编程实现段、页式内存管理的内存共享,从而深入理解操作系统的内存管理实验内容用Bochs调试工具跟踪Linux 0.11 的地址翻译(地址映射)过程,了解IA-21和Linux 0.11 的内存管理机制在Ubuntu上编写多进程的生产者-消费者程序,用共享内存作为缓冲区在信号量实验的基础上,为Linux0.11 增加共享内存功能,并将生产者-消
2021-09-01 21:41:58 806 5
原创 哈工大李治军老师操作系统实验之信号量实现和应用
实验目的加深对进程同步与互斥概念的认识掌握信号量的使用,应用它解决 生产者–消费者问题掌握信号量的实现原理实验内容在Ubuntu下编写程序,用信号量解决生产者-消费者问题在0.11中实现信号量,用生产者-消费者程序(1)检验在Ubuntu下编写测试程序程序要求生产者往文件中写入数字从0开始到最大为500,消费者从文件当中读取数字并更新文件,同时消费者向终端输出:进程ID : 读取的数字缓冲区最大10个数字。分析做信号量相关的程序需要分析哪里需要设置信号量,以及设置
2021-08-26 16:04:39 619 2
原创 哈工大李治军老师的操作系统实验之系统调用
实验目标此次实验的基本内容是:在 Linux 0.11 上添加两个系统调用,并编写两个简单的应用程序测试它们。第一个系统调用是 iam(),其原型为:int iam(const char * name);完成的功能是将字符串参数 name 的内容拷贝到内核中保存下来。要求 name 的长度不能超过 23 个字符。返回值是拷贝的字符数。如果 name 的字符个数超过了 23,则返回 “-1”,并置 errno 为 EINVAL。在 kernal/who.c 中实现此系统调用。第二个系统调
2021-08-26 16:03:31 970
原创 十八、多线程服务器的实现
文章目录实验任务实验涉及的技术实验代码本章不会去专门将多线程以及多线程相关的操作函数,有兴趣可以自己去查阅相关资料,我想网上有许多关于多线程机制的优秀资料。我会直接编写代码,直接看代码就行实验任务模拟多人聊天,即群聊。服务器接收来自各个客户端的信息,然后一一转发给群中的客户端。实验涉及的技术多线程机制网络编程实验代码服务端:负责接收来自各个客户端的消息,并转发给所有群内的客户端。#include <stdio.h>#include <stdlib.h>
2021-08-11 13:55:43 109
原创 十七、 epoll实现I/O复用
文章目录epoll理解与应用使用epoll改写回声服务端条件触发和边缘触发条件触发边缘触发使用边缘触发的回声服务器端边缘触发优点这一章的目的与I/O复用有关,之前我们 谈到的基于select函数实现的I/O复用技术,由于该技术是一个非常古老的技术,不适用于现代高并发的环境下的使用。因此需要借用新技术来替代select函数的I/O复用。epoll理解与应用理解epoll还需对照select函数进行对比,一般实现复用主要有三步:创建保存文件描述符的空间向这个空间注册或注销文件描述符监控空间内的
2021-08-10 20:21:19 171
原创 十六、关于IO流分离的内容
文章目录1. 什么是I/O流分离?2. 为什么需要I/O分流3. 当我们用fclose()无法实现半关闭的原因4. 实现真正的半关闭1. 什么是I/O流分离?回忆我们之前写的程序,最开始写的程序只要获得一个套接字并成功连接服务器,就能实现与服务器之间的数据交换,而这个数据交换从客户端角度看就是发送数据与接收数据; 而这个收发数据的过程称为流。而I/O流分离是指接收数据的流与发送数据的流实现分离,这里的分离指的是操作彼此隔离,一个流关闭不影响另外一个流的使用。这才是I/O流分离的真正理解。其实在这之前我们
2021-08-08 16:55:57 491
原创 十五、套接字和标准IO
本章主要是复习标准I/O函数收发数据的方法,例如fopen()、feof()、fgetc()、fputs(),以及将套接字文件描述符转换成FILE*结构体指针并采用标准I/O修改程序。标准I/O函数不同于系统函数,标准I/O函数是在系统函数的基础上,进行优化。系统I/O函数不再介绍,感兴趣可以去查阅《Unix系统编程》这本书,里面讲的非常全。这里主要是介绍标准I/O函数,我们的目标是将套接字变成标准I/O使其拥有标准I/O的优点。标准I/O函数主要有以下优点:标准I/O函数具有良好的移植性标准.
2021-08-07 17:06:11 131
原创 十四、TCP IP网络编程之多播与广播
文章目录多播加入多播组设置TTL以及加入多播的方法测试程序广播如何设置广播测试程序这一章主要是IP地址相关的通信方式,多播可以跨网络通信,而广播只能在网内通信。多播之所以能实现跨网通信。多播多播的传输方式采用UDP实现,与UDP的服务端、客户端之间的实现方式相近,区别在于UDP数据传输以单一对象进行数据通信,而多播数据同时传递到加入(注册)特定组的大量主机。换言之,可以同时向多个主机传递数据。多播是采用D类的IP地址(224.0.0.0~239.255.255.255),而加入“多播组”可以
2021-08-06 15:32:52 527
原创 十三、Linux网络编程中的多种IO函数
Linux网络编程之多种I/O函数注:本章所讲的所有函数都是基于Linux环境。send & recv 函数函数原型俩函数是一对,因此需要一起介绍,我们要把生产者-消费者模型去理解send()与recv()函数功能,每次recv()缓冲区就会减少数据。直至为空#include<sys/socket.h>ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags);/*sockfd: 表示与数据传
2021-08-04 17:05:47 133
原创 十二、IO复用
文章目录select函数select 函数测试程序实现I/O复用服务器采用多进程固然能很好的实现业务分离,但是开辟一个新进程需要的资源太多,而且一些简单的业务本不需要开辟一个新进程进行处理,因此出现严重的资源浪费,能不能有一种技术不仅仅能替代多进程的移步分离处理多客户端情况,而且会造成太大的资源浪费。于是I/O技术就被提出来了,I/O复用关键在于掌握select函数的使用。本章主要任务是采用I/O改写之前的基于多进程回声服务端设计,使得能够在同时处理多个客户端之前的数据交换select函数关于该
2021-08-02 22:13:40 66
原创 多进程+管道+信号量+网络编程实践
文章目录实验要求实验技术代码实践编译运行实验要求在我们第十章的基于多进程回声服务器的基础上添加一个功能:服务端将所有来自客户端的数据保存到一个文件当中。实验技术多进程技术信号处理技术Linux环境网络编程技术管道代码实践服务端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <signal.h>
2021-07-31 21:39:46 120
原创 十、多进程服务器端
文章目录一、相关操作函数1. 创建进程函数2. 防止出现僵尸进程的函数3. 信号处理函数二、基于多任务的并发服务器1. 基于进程的并发服务器模型2. 代码实现3. 通过fork函数复制文件描述符三、基于多进程的客户端读写分离1. 代码实现至于什么是多进程,这里不展开叙述,可以去查阅相关技术资料,在本章中使用到的技术有:多线程编程以及信号处理,如果对这些技术不太熟悉可以自行查看相关资料。这里只介绍几个操作函数一、相关操作函数1. 创建进程函数#include<unistd.h>pid
2021-07-31 11:17:52 167
原创 九、套接字的多种可选项
文章目录控制I/O缓冲大小的可选项1. 选项的操作函数2. 设置缓冲区大小9.2 SO_REUSEADDR1. Time-wait状态2. 为什么需要Time-wait状态?9.3 TCP_NODELAY1. Nagle算法控制I/O缓冲大小的可选项1. 选项的操作函数具体的套接字选项,这里不好展开,可以自行去查,主要介绍选项的操作函数getsocketopt(获取选项参数的函数)&&setsocketopt(设置选项参数的函数)//getsocketopt#include&l
2021-07-29 09:20:11 311
原创 (第七章)优雅地断开套接字连接
七、TCP半关闭套接字开启过程很简单,基本不会出现太大问题;但是在关闭套接字过程当中会出现各种意想不到的情况发生。因此需要单独说一下TCP套接字的关闭。文章目录七、TCP半关闭7.1 单方面断开连接的问题7.2 针对优雅断开的shutdown函数7.3 为什么需要半关闭7.4 基于半关闭的文件传输程序7.1 单方面断开连接的问题在Linux系统当中调用close()关闭套接字意味着完全断开连接,如下图所示在主机A给B发完信息之后,随即调用close()进行断开连接,此时主机B收到A的信息之
2021-07-27 17:37:13 732
原创 (第六章)基于UDP的服务器端客户端
文章目录一、理解UDP1.1 UDP套接字特点1.2 UDP内部工作原理二、实现基于UDP的服务器端/客户端2.1 操作函数2.2 基于UDP的回声服务器服务端/客户端2.3 UDP客户端套接字地址的分配三、UDP的数据传输特性和调用connect函数3.1 UDP存在数据边界验证3.2 已连接UDP套接字与未连接UDP套接字3.3 创建已连接UDP套接字一、理解UDP1.1 UDP套接字特点 UDP工作原理就跟寄信一样,写上收信地址以及收信人然后贴上邮票就可以发送了,发送完之后就不管有没有发送到即
2021-07-20 11:38:30 455
原创 基于TCP的服务器端、客户端(下)
基于TCP的服务器端、客户端(下)这一章是在上一章的基础上写的,如果没看过,请移步基于TCP的服务器端、客户端(上),通过这一章你会更加理解为什么网络编程里面需要许多协议,以及明白各种协议的使用是为了解决各种特殊的问题,回声测试就是一个很好的说明例子。注意本文所有代码测试环境是在Linux系统下,而非windows文章目录基于TCP的服务器端、客户端(下)一、回声测试问题解决1.1 检查问题1.2 客户端解决方法1.3 高阶解决方法1.4 计算机服务端、客户端实例二、TCP原理2.1 TCP套接字
2021-07-16 16:04:53 143 2
原创 基于TCP的服务器端、客户端(上)
基于TCP的服务器端、客户端(上)根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字,本节主要是TCP(面向连接的套接字)。一、TCP在网络结构当中的位置五层网络模型:对比我们发现,TCP与UDP是工作在五层网络模型中的运输层,各层的主要作用如下:(这里只是简略描述,具体还需自行查阅相关技术资料)链路层(以下关于 链路层解释来源于CSDN博主)成帧:链路层把从网络层(IP层)的数据封装成帧链路接入:规定了帧在链路上传输的规则差错检错:规定如果帧出错怎么办
2021-07-03 17:32:24 181 2
原创 地址族与数据序列
地址族与数据序列分配给套接字的IP地址与端口号IP为了接发网络数据而分配给计算机的值IP地址分为IPv6和IPv4地址,我们主要以IPv4为例。端口号为了区分程序中创建的套接字而分配给套接字的序号一、地址信息的表示回顾我们之前讲的bind函数#include<sys/socket.h>int bind(int sockfd,struct sockaddr* myaddr,socklen_t addrlen);//bind函数的作用在于将套接字和IP+端口
2021-06-30 21:31:09 121 2
原创 协议与套接字类型
协议与套接字类型文章目录协议与套接字类型协议概念理解套接字创建套接字协议族(Protocol Family)套接字类型(Type)面向连接的套接字(SOCK_STREAM)面向消息的套接字(SOCK_DGRAM)实例本章主要讲的是套接字类型以及简单的协议协议概念理解计算机网络当中有各种各样的协议,每种协议都是为了解决特定问题而出现的。例如,相隔很远的两个人进行通信,如果一方采用电话,则另外一方也必须采用电话而非书信。因此采用电话进行通信就是两个人进行通信的协议。协议的具体内容可以去参照其他解答,
2021-06-07 12:02:54 197 1
原创 计算机网络编程-基础篇01
理解网络编程和套接字基础在计算机网络当中,我们需要进行以下步骤进行网络通信:构建套接字#include<sys/socket.h>int socket(int domain,int type,int protocol);//成功则返回文件描述符,失败返回-1调用bind函数给套接字分配本机地址#incude<sys/socket.h>int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
2021-06-04 16:22:43 105 1
原创 OOP
OOPInheritance(继承)概念继承涉及两种角色:基类、派生类。基类处在继承树的顶端,负责定义在这个继承树当中所有角色的共同拥有的成员或者成员函数,而派生类负责根据各自的需要定义属于自己的成员或者成员函数。如果派生类需要访问基类的成员变量,而基类变量又无法设置成public(这样太危险),因此protected就出现了。将变量设置成protected类型就可以让派生类访问。如果派生类普遍需要实现的函数,但各自实现方式不同,此时基类给各个派生类提供虚函数进行继承,例如人类是一个基类,而亚洲人
2021-04-20 21:44:44 75
原创 C++ 补充知识
C++ 补充知识staticclass complex{ private: string name; int age; static int index; public: complex(); complex(complex &comp); static SetIndex(const int &x){index=x};}int complex::index=1; //*...... int main(
2021-04-18 20:44:41 75
原创 复习String 类的实现过程
复习String 类的实现过程String 类的声明class String{ private: char* m_data; //为了能够动态容纳字符大小,我们设置成字符指针 public: //构造函数 String(const char* cstr=0); //有默认值的参数,防止传入的参数为空使得指针指向为空 //由于class 中含有指针变量,因此我们在设计三个(拷贝构造、拷贝赋值、析构函数)重要、特殊的函数时要注意 inline S
2021-04-17 22:05:06 85
原创 C++ 堆、栈与内存管理
C++ 堆、栈与内存管理注:所有内容来自于侯捷老师的教学视频文章目录C++ 堆、栈与内存管理摘要正文1. 内存泄露2. new对象的过程3. delete对象的过程4. 动态分配的内存分布4.1 new一个对象时4.2 当new一个对象数组时摘要在C++函数体中,与C函数一样系统都会分配堆与栈给函数体.Stack:每个函数体的stack负责存储函数体所接受的参数以及返回地址,同时函数体内部以非new方式定义的对象也存储在stack当中。Heap:操作系统分配给函数体一块global内存空间,
2021-04-14 22:15:56 136
原创 C++基础
C++基本知识文章目录C++基本知识@[toc]1. 声明文件与定义文件编写规范2. 构造函数编写规范2.1 初始化问题2.2 Default value3. 参数传递与返回值3.1 非写入函数const必要性分析3.2 参数传递3.3 返回值传递3.4 友元函数4. 成员变量与成员函数4.1 成员变量存在的空间4.2 成员函数4.3 成员变量的初始化5. 动态内存分配:new、delete5.1 new申请空间并返回空间地址5.2 delete6. 访问限制6.1 public6.2 private6
2021-04-14 16:03:25 288
原创 openGL编程指南第一章
openGL编程指南第一章前言这一章主要是介绍OpenGL技术里面的一些概念文章目录openGL编程指南第一章OpenGL介绍相关概念图元(图形输出原语)模型渲染像素渲染模式渲染管线渲染管线操作流程OpenGL介绍它是一个图形API,设计目标是作为一种流线型且独立于硬件的操作接口。基于此OpenGL并没有提供复杂的操作函数,而是提供一些简单的图元工具供给程序员使用。同时,在使用OpenGL进行编程的时候,我们会发现,OpenGL其实是巨大的状态机,我们可以通过设置一系列变量(假设状态是一个对象
2021-04-13 22:13:30 220
原创 Template
Template文章目录Template思想概念区分分类思想模板是C++实现代码重用的一种重要的手段,是泛型编程的基础,模板的作用是将变量类型参数化,对具有相同逻辑结构的算法进一步抽象。模板在C++中主要分为两类:类模板、函数模板。概念区分函数模板与模板函数函数模板是用来产生函数的模板,例如:template <Typename T1,Typename T2,....>T & function(T& a,T& b){}模板函数是使用函数模板产生
2021-03-13 13:36:42 116
原创 C++基础
C++基本知识文章目录C++基本知识@[toc]1. 声明文件与定义文件编写规范2. 构造函数编写规范2.1 初始化问题2.2 Default value3. 参数传递与返回值3.1 非写入函数const必要性分析3.2 参数传递3.3 返回值传递3.4 友元函数4. 成员变量与成员函数4.1 成员变量存在的空间4.2 成员函数4.3 成员变量的初始化5. 动态内存分配:new、delete5.1 new申请空间并返回空间地址5.2 delete6. 访问限制6.1 public6.2 private6
2021-03-03 20:43:47 262 2
原创 Linux搭建openGL环境步骤
步骤安装基本的编译器以及函数库(PS:一般的系统一般会自带) sudo apt-get install build-essential安装OpenGL library sudo apt-get install libgl1-mesa-dev安装OpenGL Utilities sudo apt-get install libglu1-mesa-dev安装OpenGL Utility Toolkit sudo apt-get install lib
2021-01-03 21:22:17 674
原创 Git 操作
添加目录curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-tocchmod a+x gh-md-toc ./gh-md-toc 文件名.md然后将Table of Contents============ 下面的内容复制到对应的md文件当中,并更新即可。...
2020-11-04 15:31:14 189
原创 SSM整合步骤(详细)
文章目录工具SSM整合之整合mybatis0.建立数据库1. 建立项目结构,导入依赖包2. 创建配置文件3. 关联数据库4. 编写mybatis配置文件5.编写实体类6. 编写对应的接口7.编写对应的实现类xml文件8. 将写好的mapper文件在mybatis配置文件当中注册9.编写业务层:service层SSM整合之整合spring10.创建spring-dao.xml配置文件(整合dao层)...
2020-06-08 19:22:31 7877 8
原创 拦截器实验步骤
拦截器实验步骤开发环境:IDEA文章目录拦截器实验步骤1. 创建工程文件,导入web支持2.在web.xml当中导入spring以及servlet4. 编写applicationContext.xml文件5. 构造目录结构6. 创建拦截器的包,在该包下新建拦截器:MyIntercepter7. 测试代码8. 对设置的拦截器进行注册实例:登录验证1. 创建工程文件,导入web支持并写入相关配置2.编写applicationContext.xml文件3. 在原来的包下面创建LoginInterceptor.
2020-06-08 19:21:30 460
原创 线程与进程的比较
进程线程fork()pthread_create()return、 exit() 、_exit()return 、pthread_exit()wait()pthread_join()atexit()pthread_cleanup_push()、pthread_cleanup_pop()
2020-02-17 13:35:00 84
原创 Linux多线程之线程控制与清理
问题有时候希望线程退出时能够自动的执行某些函数,为了能达到此目的,OS 提供了两个函数帮我们完成这个功能void pthread_cleanup_push(void (*rtn)(void*), void *arg);void pthread_cleanup_pop(int execute);这两个函数是成对使用的,缺一不可。rtn: 清理函数指针,返回类型为 void 参数类型为...
2020-02-17 13:30:18 243
原创 Linux多线程之线程终止
主动终止(终止自己)调用 return (void*)var;调用void pthread_exit(void *value_ptr), 其它线程可以调用 pthread_join 获得这个针。注:这两个函数返回值都为指针类型,在线程中使用时所指向的地址必须为:malloc分配的或者全局变量;因为当线程退出是 其作用域的变量都将消失。这两个函数的返回值都能通过 int pthrea...
2020-02-17 12:44:15 429
原创 Linux多线程之线程创建
1. 函数#include <pthread.h>int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*), void *restrict arg);参数:thread 为线程id的容器, 通过类型可知为...
2020-02-17 12:25:22 204
原创 树的算法思想之递归
递归解题关键:找出递归关系找出终止条件确定返回值例子给定一个二叉树,判断它是否是高度平衡的二叉树。算法实现:int deep(struct TreeNode *p){ //确定出口 if(p==NULL) { return 0; } //递归关系 int left=1+deep(p->left); ...
2020-01-04 15:29:51 207
原创 树的遍历之层次遍历
Leetcode 题分析:考察树的层次遍历算法int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){ if(!root) { *returnSize=0; return 0; } int **res=(in...
2019-12-30 19:35:53 172
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人