linux
未读线程的概念线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源,比如内存、地址空间、打开的文件等等。
线程是CPU调度和分派的基本单位
进程是分配资源的基本单位
进程:正在运行的程序(狭义)
是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称,从操作系统核心角度来说,进程是操作系统调度除CPU时间片外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)
为什么使用多线程?1️⃣ 避免阻塞:单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。
2️⃣ 避免CPU空转:应用程序经常会涉及到 RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。
3️⃣ 提升效率:一个进程要独立拥有 ...
linux
未读进程的概念以及应用 占用内存空间的正在运行的程序即为进程
从操作系统的角度看,进程是程序流的基本单位,若创建多个进程,则操作系统将同时运行。有时一个程序运行过程中也会产生多个进程。
CPU核的个数与进程数 :一个CPU中可能包含多个运算设备(核)。核的个数与可同时运行的进程数相同。
若进程数超过了核数,进程将分时使用CPU资源。
进程ID:1 要分配给操作系统启动后的(用于协助操作系统)首个进程,因此用户进程无法得到ID值1
创建进程
通过调用fork函数创建进程
1pid_t pid = fork();
fork函数将创建调用的进程副本,也就是说,是复制正在运行的、调用fork函数的进程。另外两个进程都将执行fork调用后的语句(fork函数返回后)。同一个进程、复制相同的内存空间,之后的程序要根据fork函数的返回值加以区分。即利用fork函数的如下特点区分程序执行流程。
父进程:fork函数返回子进程ID.
子进程:fork函数返回0
僵尸进程
产生僵尸进程的原因:
调用fork函数产生子进程的终止方式。
传递参数并调用exit函数。
main函数中执 ...
简单的TCP 客户端 - 服务器模型run_client函数123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051void run_client(){ // 创建一个TCP套接字 int client = socket(PF_INET, SOCK_STREAM, 0); /* PF_INET 指定协议族为 IPv4 SOCK_STREAM:指定套接字类型为流套接字 0:指定协议类型,这里使用默认协议 如果socket函数成功创建套接字,会返回一个非负整数作为套接字描述符;如果失败,返回-1。 */ // 定义一个struct sockaddr_in类型的变量addr,用于存储地址信息。 struct sockaddr_in servaddr; // 初始化服务器地址结构体 memset(&servaddr, 0, sizeof(servaddr)); ...
linux
未读一、套接字编程TCP服务端
1️⃣ 创建套接字socket()
12345int sockfd = socket(PF_INET, SOCK_STREAM, 0);// PF_INET 指定协议族为 IPv4// SOCK_STREAM:指定套接字类型为流套接字// 0:指定协议类型,这里使用默认协议// 如果socket函数成功创建套接字,会返回一个非负整数作为套接字描述符;如果失败,返回-1。
2️⃣ 存储地址信息
1234567891011// 定义一个struct sockaddr_in类型的变量addr,用于存储地址信息。struct sockaddr_in addr;//指定地址族为 IPv4,AF代表 “Address Family”,AF_INET和前面的PF_INET相对应。addr.sin_family = AF_INET; // INADDR_ANY,表示该套接字将绑定到服务器上的所有网络接口。addr.sin_addr.s_addr = INADDR_ANY;// htons函数将主机字节序的端口号 9527 转换为网络字节序,并存储在sin_port字段中。 ...
一、指针和引用的区别① 定义和概念
指针:指针是一个变量,其值为另一个变量的地址。指针本质上是存储内存地址的变量
12int a = 10;int* p = &a; // p 是指针,存储a的地址
引用:引用是一个别名,它为已有的变量创建一个新的名字。引用初始化必须与某个变量绑定,并且一旦绑定之后不能再绑定到其他变量。
12int a = 10;int& ref = a; // ref是 a的引用,相当于a的别名。
② 语法差异
指针语法:声明指针时候使用*符号、获取指针指向的变量的值需要使用解引用操作符*、需要显式地进行地址赋值。
123int a = 10;int* p = &a; // &a 表示获取a的地址int value = *p; // *p表示解引用,得到a的值
引用的语法:声明引用使用&符号、引用像普通变量一样使用,不需要使用解引用操作符、引用必须在声明时进行初始化,并且无法更改引用的对象。
123int a = 10;int& ref = a; // ref 是 a 的引用ref = 20; ...
Cpp
未读C++ 调用汇编代码使用汇编代码的时机和意义
Microsoft c++ x86 内联汇编
12345678910111213141516171819202122#include <iostream>int main(){ int a = 250; // 不需要加分号 使用__asm来分割 __asm mov eax,a __asm add eax,1 __asm mov a,eax std::cout << a; // 251 // 这样省略了很多__asm __asm { mov eax, a add eax, 1 mov a, eax } std::cout << a; // 252}
__asm 中汇编使用规范
_asm支持
Pentium 4 和 AMD Athlon 所有操作码
支持MMX指令集
可以利用_emit创建目标处理器支持的其他指令
如果_emit生成修改寄存器的值 ...
多态概念
多态是面向对象编程中的一个重要概念,它允许在基类的指针或引用指向派生类对象时,调用不同的函数实现。换句话说,多态是指同一接口在不同对象中有不同的实现方式。
多态的基本分类:
① 编译时多态(静态多态):通过函数重载和运算符重载来实现。
② 运行时多态 (动态多态):通过继承和虚函数来实现。
对象多态
① 向上转型 父类==>子类 人是动物
② 向下转型 子类==>父类 动物是人 相当于用子类代替父类 (大神和沙雕之间二象性)
1234567891011121314151617181920212223242526272829303132333435363738// 30多态概念.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>class Animal{public: int age;};class Human :public Animal{public: int Mone ...
继承的概念
12345678910class Base{};class Derive:public Base//公有继承{};class Derive2:protected Base //保护继承{};class Derive3:private Base//私有继承{};//上面的代码中,Derive,Derive2,Derive3都继承自Base基类//区别就是继承方式不同
多继承
如果省略继承方式,默认为private
123class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,....{ };
private 和 protected 区别:类继承,private无法被访问 protected可以被访问。
继承的时候,私有变量是占内存空间的,但是没办法访问。。。
继承中的访问控制
一般来说,尽量设计类的成员变量为private,如果需要访问这些成员变量,应该提供setter ...
Cpp
未读运算符重载的主要目的是为了让目标代码更方便使用和维护,而不是提升开发效率,重载运算符未必能提升开发效率。
① 让类也支持原生的运算 比如 + - * /
② 提升对程序的控制权 比如重载new delete new[] delete[]
它允许你为自定义类型(如类或结构体)定义操作符的行为,使得这些操作符可以像内建类型一样工作。通过重载运算符,可以使自定义对象之间的运算更加直观和简洁。运算符重载是通过定义特殊的成员函数或友元函数来实现的
初探运算符重载
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <iostream>class Person{ friend bool operator<(Person& psa, Person& psb); friend bool operator<(Person& psa, unsigned short _Age); ...
静态成员变量
static 关键字声明一个类的静态成员变量,类的静态成员变量的特点:
1️⃣ 所有类的实例中,共享类中的静态成员变量
2️⃣ 类的静态成员变量在没有类的实例的情况下,依然可以访问
3️⃣ 类的静态成员变量并不完全属于类
12345678910111213class T{public: static int count; // 内存空间不属于类 int hp;};int T::count = 100; //定义 必须加上T::int main(){ T::cout << 350; T t1;}
静态成员变量的初始化
123456class T{ inline static int count{}; // 利用inline 在类里面定义countpublic: int hp;};
12345678910111213141516171819202122class T{ inline static int count ...